﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Security.Cryptography;
using System.IO;
using System.Configuration;



namespace Zhuang.Utility.Common.Encryption
{
    public class Crypto
    {
        private readonly string IV = "SuFjcEmp/TE=";//"SuFjcEmp/TE=";
        //private readonly string IV = string.Empty;
        private readonly string Key = "KIPSToILGp6fl+3gXJvMsN4IajizYBBT";//"KIPSToILGp6fl+3gXJvMsN4IajizYBBT";
        //private readonly string Key = string.Empty;

        public Crypto()
        {
            //IV = ConfigurationManager.AppSettings["IV"];
            //Key = ConfigurationManager.AppSettings["Key"];
        }

        /// <summary>
        /// 获取加密后的字符串
        /// </summary>
        /// <param name="inputValue">输入值.</param>
        /// <returns></returns>
        public string GetEncryptedValue(string inputValue)
        {
            try {
                TripleDESCryptoServiceProvider provider = this.GetCryptoProvider();

                // 创建内存流来保存加密后的流
                MemoryStream mStream = new MemoryStream();

                // 创建加密转换流
                CryptoStream cStream = new CryptoStream(mStream,

                provider.CreateEncryptor(), CryptoStreamMode.Write);
                // 使用UTF8编码获取输入字符串的字节。
                byte[] toEncrypt = new UTF8Encoding().GetBytes(inputValue);

                // 将字节写到转换流里面去。
                cStream.Write(toEncrypt, 0, toEncrypt.Length);
                cStream.FlushFinalBlock();

                // 在调用转换流的FlushFinalBlock方法后，内部就会进行转换了,此时mStream就是加密后的流了。
                byte[] ret = mStream.ToArray();

                // Close the streams.
                cStream.Close();
                mStream.Close();

                //将加密后的字节进行64编码。
                return Convert.ToBase64String(ret);
            }
            catch
            {
                return "";
            }


        }

        /// <summary>
        /// 获取加密服务类
        /// </summary>
        /// <returns></returns>
        private TripleDESCryptoServiceProvider GetCryptoProvider()
        {
            TripleDESCryptoServiceProvider provider = new TripleDESCryptoServiceProvider();

            provider.IV = Convert.FromBase64String(IV);
            provider.Key = Convert.FromBase64String(Key);

            return provider;

        }

        /// <summary>
        /// 获取解密后的值
        /// </summary>
        /// <param name="inputValue">经过加密后的字符串.</param>
        /// <returns></returns>
        public string GetDecryptedValue(string inputValue)
        {
            try {
                TripleDESCryptoServiceProvider provider = this.GetCryptoProvider();
                byte[] inputEquivalent = Convert.FromBase64String(inputValue);

                // 创建内存流保存解密后的数据
                MemoryStream msDecrypt = new MemoryStream();

                // 创建转换流。
                CryptoStream csDecrypt = new CryptoStream(msDecrypt,
                provider.CreateDecryptor(),
                CryptoStreamMode.Write);

                csDecrypt.Write(inputEquivalent, 0, inputEquivalent.Length);
                csDecrypt.FlushFinalBlock();

                csDecrypt.Close();

                //获取字符串。
                return new UTF8Encoding().GetString(msDecrypt.ToArray());
            }
            catch {
                return "";
            }


        }

    }
}
